/**
 * AppletViewer.hava
 */
package org.dicr.gui;

import java.applet.*;
import java.awt.event.*;

import javax.swing.*;

/***********************************************************************************************************************
 * Applet Viewer
 * 
 * @author Igor A Tarasov &lt;java@dicr.org&gt;
 * @version 060120
 **********************************************************************************************************************/
public class AppletViewer extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected Applet applet = null;

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	public AppletViewer() {
		this.addComponentListener(new AppletComponentListener());
		this.addWindowFocusListener(new AppletWindowListener());
	}

	public AppletViewer(Applet theApplet) {
		this();
		setApplet(theApplet);
	}

	/*******************************************************************************************************************
	 * Установить апплет
	 ******************************************************************************************************************/
	public void setApplet(Applet theApplet) {
		if (this.applet == theApplet) { return; }
		if (this.applet != null) {
			this.applet.stop();
			this.applet.destroy();
		}
		this.applet = theApplet;
		if (theApplet != null) {
			this.setContentPane(theApplet);
			this.setTitle(theApplet.getAppletInfo());
			theApplet.init();
		} else {
			this.setContentPane(new JPanel());
			this.setTitle("Applet Viewer (C) by Dicr - No Applet");
		}
	}

	/*******************************************************************************************************************
	 * Возвращает апплет
	 ******************************************************************************************************************/
	public Applet getApplet() {
		return this.applet;
	}

	/*******************************************************************************************************************
	 * Показать окно (переопределение)
	 ******************************************************************************************************************/
	@Override
	public void setVisible(boolean visible) {
		if (!visible && this.applet != null) {
			this.applet.stop();
		}
		super.setVisible(visible);
	}

	public void startApplet() {
		if (this.applet == null) { throw new IllegalStateException("applet not set"); }
		this.applet.start();
	}

	public void stopApplet() {
		if (this.applet == null) { throw new IllegalStateException("applet not set"); }
		this.applet.stop();
	}

	/*******************************************************************************************************************
	 * ######################################################################### Слушатель компонента окна
	 * #########################################################################
	 ******************************************************************************************************************/
	class AppletComponentListener extends ComponentAdapter {
		@Override
		public void componentResized(ComponentEvent e) {
			if (AppletViewer.this.applet != null) {
				AppletViewer.this.applet.resize(getSize());
			}
		}
	}

	/*******************************************************************************************************************
	 * ######################################################################### Слушатель окна
	 * #########################################################################
	 ******************************************************************************************************************/
	class AppletWindowListener extends WindowAdapter {
		/***************************************************************************************************************
		 * Открытие окна
		 **************************************************************************************************************/
		@Override
		public void windowOpened(WindowEvent e) {
			if (AppletViewer.this.applet != null) {
				AppletViewer.this.applet.init();
			}
		}

		/***************************************************************************************************************
		 * закрытие окна
		 **************************************************************************************************************/
		@Override
		public void windowClosing(WindowEvent e) {
			if (AppletViewer.this.applet != null) {
				AppletViewer.this.applet.stop();
				AppletViewer.this.applet.destroy();
			}
		}

		/***************************************************************************************************************
		 * Окно свернуто
		 **************************************************************************************************************/
		@SuppressWarnings("unused")
		public void windowIconifed(WindowEvent e) {
			if (AppletViewer.this.applet != null) {
				AppletViewer.this.applet.stop();
			}
		}

		/***************************************************************************************************************
		 * Окно развернуто
		 **************************************************************************************************************/
		@SuppressWarnings("unused")
		public void windowDeiconifed(WindowEvent e) {
			if (AppletViewer.this.applet != null) {
				AppletViewer.this.applet.start();
			}
		}
	}
}
